"""
Das ist das Kernstueck des Spiels. Hier wird das Spiel gestartet. Unter Anderem werden der Timer, der RenderScreen, sowie INIReader und Log initialisiert.
Desweiteren wird nach der Grundinitialisierung die GameLoop gestartet.

@author: Max
"""
import os, sys
import pygame

import Core, GUI

class GameCore(object):
    """
    Das ist das Kernstueck des Spiels. Hier wird das Spiel initialisiert
    und die notwendigen Instanzen erzeugt.
    Hierzu zaehlen der Log, der Screen, der INI-Reader, sowie die spielinterne Uhr
    """
    def __init__(self):
        self.bRunning = True
        
        self.Log = 0
        self.InputHandler = 0
        self.RenderScreen = 0
        self.INIReader = 0
        self.Clock = 0
        
        
    def startGame(self):
        """
        Diese Funktion startet das Spiel und initialisiert alle notwendigen Instanzen.
        """
        pygame.init()
        
        # Spiel initialisieren
        self.setupLog() 
        self.setupClock()
        self.setupRenderScreen(self.setupINIReader())
        
        # Starten der GameLoop
        self.mainloop()
        
    def setupLog(self):
        """
        Initialisieren eines Core.Log-Objekts
        """
        self.Log = Core.Log(os.path.join("..", "Resources", "Configs", "game.log"))
        self.Log.printToLog("GameCore: Spiel wird gestartet.")
    
    def setupINIReader(self):
        """
        Initialisieren eines Core.INIReader-Objekts
        """
        self.INIReader = Core.INIReader(self.Log)
        cpConfig = self.INIReader.readINIfile()
        if cpConfig == None:
            sys.exit(0)
        return cpConfig
        
    def setupClock(self):
        """
        Initialisieren eines pygame.time.Clock-Objkekts
        """
        self.Clock = pygame.time.Clock()
        
    def setupRenderScreen(self, cpConfig):
        """
        Initialisieren eines GUI.RenderScreen-Objekts
        """
        self.RenderScreen = GUI.RenderScreen(self.Log, self.Clock)
        self.RenderScreen.setupMainWindow(cpConfig)
       
    def mainloop(self):
        """
        Dies ist die GameLoop. Sie laeuft bis bRunning auf False gesetzt wird.
        """
        while self.bRunning:
            self.bRunning = self.RenderScreen.update()
            
        self.Log.printToLog("GameCore: MainLoop-Quit - Das Programm wird geschlossen.")
        self.Log.closeLogFile()
        pygame.quit()